﻿/*
 *  ============================================================================
 *  Name:           Gestão de parques de estacionamento
 *  Author:         João Faria
 *  Email:          a8836@alunos.ipca.pt
 *                  jfaria.gmr@gmail.com
 *  Version:        0
 *  Date:           2013-04-10
 *  Copyright:       
 *  Description:    IPCA - Programação II
 *                  Projecto final
 *  ============================================================================
 */
using System;
using System.Collections.Generic;
using GesParking.BusinessObjects;
using GesParking.DataLayer;
using GesParking.Exceptions;

namespace GesParking.BusinessLayer
{
    /// <summary>
    /// Classe que gere os utilizadores
    /// </summary>
    public class UsersBL
    {
        #region Estado

        UsersDL users;

        #endregion

        #region Propriedades

        /// <summary>
        /// Propriedade users
        /// </summary>
        public UsersDL Users
        {
            get { return users; }
            set { users = value; }
        }

        #endregion

        #region Construtor

        /// <summary>
        /// Construtor por omissão
        /// </summary>
        public UsersBL()
        {
            users=new UsersDL();
        }

        #endregion

        #region Métodos da classe

        /// <summary>
        /// Verifica se user existe
        /// </summary>
        /// <param name="u">User a verificar</param>
        /// <returns>True caso exista, false caso não exista</returns>
        public static bool ExisteUserBL(UserBO u)
        {
            IEnumerator<UserBO> enu = UsersDL.ListDL().GetEnumerator();
            while (enu.MoveNext())
            {
                if (enu.Current == u)
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// Verifica se user existe
        /// </summary>
        /// <param name="id">Id do user</param>
        /// <returns>True caso exista, false caso não exista</returns>
        public static bool ExisteUserBL(Guid id)
        {
            IEnumerator<UserBO> enu = UsersDL.ListDL().GetEnumerator();
            while (enu.MoveNext())
            {
                if (enu.Current.Id == id)
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// Get parque
        /// </summary>
        /// <param name="id">Id parque</param>
        /// <returns>Parque</returns>
        public static UserBO Get(Guid id)
        {
            IEnumerator<UserBO> enu = UsersDL.ListDL().GetEnumerator();
            while (enu.MoveNext())
            {
                if (enu.Current.Activo == true)
                {
                    return (enu.Current);
                }
            }
            throw new UserNotFoundException(); ;
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Adiciona um novo user
        /// </summary>
        /// <param name="u">Utilizador a adicionar</param>
        /// <returns>True caso user seja adicionado</returns>
        public bool AddBL (UserBO u)
        {
            if (ExisteUserBL(u))
            {
                throw new DuplicateUserException();
            }
            UsersDL.AddDL(u);
            UsersDL.Alterado = true;
            return true;
        }

        /// <summary>
        /// Desactiva um utilizador
        /// </summary>
        /// <param name="u">Utilizador a desactivar</param>
        /// <returns>True caso o user seja desactivado</returns>
        public bool DisableBL(UserBO u)
        {
            if (!ExisteUserBL(u))
            {
                throw new UserNotFoundException();
            }
            UsersDL.DisableDL(u);
            UsersDL.Alterado = true;
            return true;
        }

        /// <summary>
        /// Desactiva um user
        /// </summary>
        /// <param name="id">Id do user a desactivar</param>
        /// <returns>True caso o user seja desactivado</returns>
        public bool DisableBL(Guid id)
        {
            if (!ExisteUserBL(id))
            {
                throw new UserNotFoundException();
            }
            IEnumerator<UserBO> enu = UsersDL.ListDL().GetEnumerator();
            while (enu.MoveNext())
            {
                if (enu.Current.Id == id)
                {
                    enu.Current.Activo = false;
                    UsersDL.Alterado = true;
                }
            }
            return true;
        }

        /// <summary>
        /// Actualiza o nome de um user
        /// </summary>
        /// <param name="id">Id do user</param>
        /// <param name="n">Nome do user</param>
        /// <returns>True caso seja actualizado</returns>
        public bool UpdateNomeUserBL(Guid id, string n)
        {
            if (!ExisteUserBL(id))
            {
                throw new UserNotFoundException();
            }
            UsersDL.UpdateUserNameDL(id, n);
            UsersDL.Alterado = true;
            return true;
        }

        /// <summary>
        /// Lista os users activos
        /// </summary>
        /// <returns>Lista de users activos</returns>
        public List<UserBO> ListBL()
        {
            List<UserBO> list = UsersDL.ListDL();
            IEnumerator<UserBO> enu = UsersDL.ListDL().GetEnumerator();
            while (enu.MoveNext())
            {
                if (enu.Current.Activo == true)
                {
                    list.Add(enu.Current);
                }
            }
            return list;
        }

        /// <summary>
        /// Grava os dados dos users
        /// </summary>
        public void Save()
        {
            /* 
             * Falta tratar erros com acessos e permissões de ficheiros
             */
            UsersDL.Save();
        }

        /// <summary>
        /// Classe que lê os dados dos users
        /// </summary>
        public  void Read()
        {
            /* 
             * Falta tratar erros com acessos e permissões de ficheiros
             */
            UsersDL.Read();
        }

        #endregion
    }
}
